package algorytmy;

import java.util.concurrent.CountDownLatch;


//ta funkcja od hashu jest do bani
//jak wzorzec bedzie za dlugi to program sie wysypie
public class KarpRabin extends WyszukiwanieWzorca {
	
	private long mul = 1;
	public KarpRabin(char[] wzorzec, char[] tekst, int start, int koniec,
			CountDownLatch cd) {
		super(wzorzec, tekst, start, koniec, cd);
	}

	@Override
	public void run() {
		long hp;
		long hs;
		int i;
		hp = hash(wzorzec);
		hs = hash(tekst);
		
		i = 0;
		
		while(true){
			if((hp == hs) && match(i)){	
				dodajPozycje(i);
			}
			i++;
			if(i > (tekst.length - wzorzec.length)) break;
			hs = (hs - (tekst[i-1] - 65)  * mul) * 3 + tekst[i + wzorzec.length - 1] - 65;
		}
		cd.countDown();
	}
	
	private boolean match(int from){
		boolean match = true;
		for(int i = 0; i < wzorzec.length; i++){
			if(wzorzec[i] != tekst[i + from]){
				match = false;
				break;
			}
		}
		
		return match;
	}
	
	private int hash(char[] x){
		int i, hx;
		hx = 0;
		mul = 1;
		for(i = 0;i < wzorzec.length; i++){
			hx = 3 * hx + (x[i] - 65);
			mul *= 3;
		}
		mul /= 3;
		return hx;
	}

}
